In [1]:
import os
import pickle
import numpy as np
import pandas as pd
from utils_res import return_dict, bad_scores, accuracy_plot, accuracy, check_selectivity, get_len, common_neurons, common_neurons_percentage, get_bottom, Init, common_neurons_percentage_multiple, common_neurons_multiple

эксперименты с MBERT¶

Загружаем метрики и ранжирование нейронов¶

In [2]:
path = os.path.abspath('../')+'/results/mbert_de/'
gsd = Init(path, 'de', 'gsd')

with open(f'{path}weights_de_gsd.pkl', 'rb') as f:
    weights_gsd = return_dict(pickle.load(f), 'de')
In [3]:
path = os.path.abspath('../')+'/results/mbert_de2/'
gsd2 = Init(path, 'de', 'gsd')
In [4]:
path = os.path.abspath('../')+'/results/mbert-gum2/'
gum = Init(path, 'en', 'gum')
In [5]:
with open(f'{path}weights_en_gum.pkl', 'rb') as f:
    weights_gum = return_dict(pickle.load(f), 'en')
In [6]:
path = os.path.abspath('../')+'/results/mbert-gum/'
gum2 = Init(path, 'en', 'gum')
In [7]:
path = os.path.abspath('../')+'/results/mbert-kenet/'
kenet = Init(path, 'tr', 'kenet')

Тут: 2 эксперимента на одном и том же англ. датасете¶

In [8]:
accuracy_plot(gum.scores, gum.size)

Сбой при повторении эксперимента¶

In [9]:
accuracy_plot(gum2.scores, gum2.size)

Control Task¶

1 эксперимент¶

In [10]:
selectivity = check_selectivity(gum.scores) - check_selectivity(gum.scores_c)
#'Selectivity (Diff. between true task and control task performance)
dict(zip(list(gum.scores.keys()), selectivity))
Out[10]:
{'Definite': 0.25595984943538275,
 'Case': 0.2743055555555556,
 'Gender': 0.44927536231884063,
 'Number': 0.1961451247165532,
 'Degree': 0.03234501347708896,
 'PronType': 0.44311377245508987,
 'NumType': 0.19169329073482422,
 'Person': 0.458864426419467,
 'VerbForm': 0.32011331444759206,
 'Mood': 0.29166666666666663,
 'Tense': 0.3311111111111112}

2 эксперимент¶

In [11]:
selectivity = check_selectivity(gum2.scores) - check_selectivity(gum2.scores_c)
#'Selectivity (Diff. between true task and control task performance)
dict(zip(list(gum2.scores.keys()), selectivity))
Out[11]:
{'Definite': 0.22710163111668757,
 'Case': 0.23611111111111105,
 'Gender': 0.4616977225672878,
 'Number': 0.27324263038548746,
 'Degree': -0.05121293800539084,
 'PronType': 0.5349301397205589,
 'NumType': -0.17252396166134176,
 'Person': 0.5249130938586326,
 'VerbForm': -0.036827195467422136,
 'Mood': 0.2934782608695653,
 'Tense': 0.34888888888888886}

Топ и боттом нейроны¶

Про ранжирование нейронов¶

Раньше -- просто смотрела на N нейронов.

Improved -- смотреть на основе весов. Можно смотреть топ-10% нейронов. А можно топ-1%. А можно топ-30%. Отсечки идут с шагом 1. Но то, что входит в топ-1, например нейрон #2, #9654, #700 -- попадают в chunk без ранжирования.

Как это может выглядеть:

  • top-1% по весу: 2 нейрона,
  • top-2% по весу: 11 нейронов (2+9),
  • top-3% по весу: 19 нейронов, и т.д. -- 32, 45, 62, 77, 92, 109, 131

Другой метод: на основе определенного theshold'а.

neurons with weight > threshold * max_weight -- top neurons (мой трешхолд 0.5).

Top 10%¶

Чтобы сократить количество графиков, просто посмотрим на разницу скора на всех нейронах и на топ-10.

In [12]:
selectivity = check_selectivity(gum.scores) - check_selectivity(gum.scores_keep_top)
dict(zip(list(gum.scores.keys()), selectivity))
Out[12]:
{'Definite': 0.020075282308657516,
 'Case': -0.015625,
 'Gender': -0.020703933747411973,
 'Number': -0.06575963718820865,
 'Degree': -0.13207547169811318,
 'PronType': -0.08982035928143706,
 'NumType': 0.006389776357827448,
 'Person': -0.04634994206257237,
 'VerbForm': 0.005665722379603388,
 'Mood': -0.01630434782608703,
 'Tense': 0.004444444444444473}

ВЫВОД: на топ кое-где метрики выше --> возможно, меньше переобучается.

Control task на топ-нейронах:

In [13]:
selectivity = check_selectivity(gum.scores_keep_top) - check_selectivity(gum.scores_keep_top_c)
dict(zip(list(gum.scores.keys()), selectivity))
Out[13]:
{'Definite': 0.26097867001254704,
 'Case': 0.3107638888888889,
 'Gender': 0.2981366459627329,
 'Number': 0.2868480725623582,
 'Degree': 0.02695417789757415,
 'PronType': 0.5349301397205588,
 'NumType': -0.028753993610223683,
 'Person': 0.5283893395133257,
 'VerbForm': 0.3087818696883853,
 'Mood': 0.1938405797101449,
 'Tense': 0.29333333333333333}

ВЫВОД: у каких-то категорий селективность на топ-нейронах выше, чем на всех, но не везде.

Сколько вообще нейронов попадают в топ-10 %¶

In [14]:
get_len(gum.top_neurons)

ВЫВОД: чем больше меток у категории, тем больше нейронов нужно.

По методу трешхолда: где-то больше нейронов, где то меньше.

In [15]:
get_len(gum.ordered_neurons_thres)

Результаты на топ-10 и на трешхолд +- сравнимы. На трешхолде даже получше.

In [16]:
selectivity = check_selectivity(gum.scores_keep_top) - check_selectivity(gum.scores_keep_thres)
dict(zip(list(gum.scores.keys()), selectivity))
Out[16]:
{'Definite': 0.016311166875784155,
 'Case': 0.0,
 'Gender': -0.008281573498964745,
 'Number': 0.03628117913832196,
 'Degree': -0.0026954177897574594,
 'PronType': 0.003992015968063867,
 'NumType': -0.0031948881789137795,
 'Person': 0.017381228273464666,
 'VerbForm': 0.07790368271954673,
 'Mood': 0.0036231884057971175,
 'Tense': 0.025555555555555554}

Пересечение топ-10 и метода треш холда.

In [17]:
common_neurons(gum.top_neurons, gum.ordered_neurons_thres)
Out[17]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
0 137 365 334 104 241 756 503 197 228 83 108
In [18]:
common_neurons_percentage(gum.top_neurons, gum.ordered_neurons_thres) # в процентном соотношении
Out[18]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
0 66.83 72.13 74.55 55.61 59.36 80.0 84.4 64.59 49.67 60.58 57.14

Интересное о bottom-нейронах¶

In [19]:
gum_bot_neurons = get_bottom(gum.ordered_neurons, gum.bottom_neurons)
gum_bot_neurons2 = get_bottom(gum.ordered_neurons, gum.bottom_neurons2)

Вот столько попадает в bottom 10%

In [20]:
get_len(gum_bot_neurons)

Вот столько попадает в bottom 2%

In [21]:
get_len(gum_bot_neurons2)

Где-то мы видим очень много нейронов даже в 2% отсечке с конца. -> категории, у которых больше меток в категории наверняка более распределены по НС?

Вот тут скор на 2% нейронов. Где-то вполне высокий. Почему? Потому что туда попало много нейронов, и в них тоже какая то информация содержится?

In [22]:
accuracy(gum.scores_keep_bot2)

Но не так хорошо, как если мы будем выбирать нейроны на основе их веса (тут по методу трешхолда).

In [23]:
accuracy(gum.scores_keep_thres)

Печальные результаты¶

По каким-то причинам эксперимент не является устойчиво воспроизводимым и консистентным.

100 % каждый раз я подаю одни и те же данные, 100 % эмбеддинги предложений одинаковы.

Топ-10 % нейронов по весу не вполне приятно пересекается.

In [24]:
common_neurons_percentage(gum.top_neurons, gum2.top_neurons)
Out[24]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
0 57.09 52.91 35.5 34.32 34.15 33.18 32.46 33.05 41.23 58.43 38.66
In [25]:
common_neurons_percentage(gsd.top_neurons, gsd2.top_neurons) #тут для немецкого
Out[25]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
0 66.51 36.67 39.42 68.9 35.96 37.74 56.56 31.55 45.33 51.67 67.57

Посмотрим на то, как выглядят веса для простой категории Definite, которая не должна быть слишком распределенной, поскольку в топ-10 нейронов попадает ~200 нейронов.

In [26]:
sorted(weights_gum['Definite'][1][0])[::-1][:10] 
Out[26]:
[0.08859632,
 0.08207875,
 0.07770009,
 0.075593345,
 0.073608495,
 0.07256823,
 0.07196249,
 0.06991484,
 0.06937321,
 0.06898728]
In [27]:
sorted(weights_gum['Definite'][1][0])[::-1][100:120] 
Out[27]:
[0.043743458,
 0.04369351,
 0.043676846,
 0.043311443,
 0.04313827,
 0.04313678,
 0.043119337,
 0.043060347,
 0.043053053,
 0.04287555,
 0.042775776,
 0.042760152,
 0.04224263,
 0.04223775,
 0.04200991,
 0.042004265,
 0.041920666,
 0.041785453,
 0.041685317,
 0.041599818]

Веса маленькие и какие то погрешности получаются? Не знаю, как оценить

In [28]:
common_neurons_percentage_multiple(gum.ordered_neurons, gum2.ordered_neurons)
Out[28]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
5% 58.62 54.87 25.76 24.75 32.09 26.39 28.77 33.53 38.72 58.62 33.33
10% 58.26 51.90 34.46 34.87 34.20 31.76 31.53 32.86 42.26 54.94 37.04
20% 66.06 57.84 39.09 39.43 36.52 41.74 35.42 41.09 44.44 59.24 42.27
30% 64.00 59.99 41.51 39.79 40.59 48.33 40.80 44.79 48.50 62.00 42.37
40% 63.49 62.33 45.15 43.07 44.74 56.94 44.88 48.01 51.38 61.49 44.86
50% 65.39 66.73 49.42 43.40 48.71 62.38 49.99 51.16 55.28 65.23 47.56
75% 70.60 75.67 58.87 50.47 59.75 82.20 64.76 60.38 67.50 69.19 53.20
80% 71.84 77.24 62.14 52.11 63.22 86.26 68.60 63.08 71.35 69.68 53.91
90% 75.94 83.55 68.87 55.93 73.40 94.92 79.95 68.29 79.96 76.78 57.75
99% 88.67 96.58 93.45 72.70 95.04 100.00 98.74 93.81 98.20 89.35 72.95

Вывод?

Версии

  • Метка для слова, а смотрим на эмбеддинг предложения
  • Плохие данные? Мало данных?
  • Правда ничего особо качественного не учится

Что делать дальше:

  • в этой части, наверное, можно каким-то образом выбирать наименьшие chunk'и нейронов, выделенных на основе разных экспериментов, разных методов. Это подобие нахождения minimal neural set, но надо понять, какую погрешность на скоре мы могли бы себе позволить? Стоит ли вообще это делать? (эксперимент ниже с турецким BERT).

  • перейти к другим видам пробинга?

Эксперимент с турецким¶

Kenet dataset¶

In [29]:
accuracy_plot(kenet.scores, kenet.size)

Тут все плохо даже без Control Task.

In [30]:
get_len(kenet.top_neurons)

На топ-10% нейронов также все крайне печально по пересечению с экспериментами на GUM датасете.

In [31]:
common_neurons_percentage(kenet.top_neurons, gum.top_neurons)
Out[31]:
Definite Case Number Degree PronType NumType Person VerbForm Mood Tense
0 1.07 4.97 3.67 4.35 4.6 3.59 3.82 3.87 2.96 7.6

German¶

In [32]:
accuracy_plot(gsd.scores, gsd.size)
In [33]:
accuracy_plot(gsd2.scores, gsd2.size)
In [34]:
selectivity = check_selectivity(gsd.scores) - check_selectivity(gsd.scores_c)
#'Selectivity (Diff. between true task and control task performance)
dict(zip(list(gsd.scores.keys()), selectivity))
Out[34]:
{'Definite': 0.4018691588785047,
 'Case': 0.4784172661870503,
 'Gender': 0.29555555555555557,
 'Number': 0.3434466019417475,
 'Degree': 0.09836065573770486,
 'PronType': 0.33655705996131524,
 'NumType': 0.06727828746177367,
 'Person': 0.33215547703180215,
 'VerbForm': 0.2816728167281673,
 'Mood': 0.030303030303030276,
 'Tense': 0.3033333333333333}

Для двух экспериментов на нем. датасете¶

In [35]:
common_neurons_percentage_multiple(gsd.ordered_neurons, gsd2.ordered_neurons)
Out[35]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
5% 65.00 29.75 38.62 61.29 33.02 31.57 62.16 22.66 45.83 39.44 79.55
10% 68.56 35.21 37.88 71.03 36.90 36.66 55.41 30.23 43.61 54.12 70.54
20% 64.85 39.70 42.47 64.75 41.43 43.15 60.56 35.12 47.97 52.94 75.32
30% 68.00 43.72 47.63 69.61 42.80 50.20 63.28 38.39 51.76 52.13 73.31
40% 66.87 48.48 50.93 69.86 46.40 57.18 64.16 42.61 53.45 53.99 73.10
50% 70.89 52.55 54.97 70.68 50.53 62.98 64.86 43.81 56.07 55.11 76.26
75% 73.94 66.27 64.42 73.43 61.73 78.95 68.54 56.20 65.06 64.27 77.75
80% 75.08 69.08 66.69 74.20 64.23 82.92 68.41 59.53 67.65 68.51 76.76
90% 79.81 79.04 74.14 76.10 72.75 92.46 72.07 70.17 74.18 79.04 79.78
99% 89.59 98.22 94.14 84.53 94.35 99.92 87.16 96.51 93.22 96.56 91.72

Для разных языков¶

In [36]:
common_neurons_multiple(gum.ordered_neurons, gsd.ordered_neurons) #англ.и нем.
Out[36]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
5% 1 7 11 4 7 15 5 3 11 1 5
10% 13 23 41 15 37 73 18 12 42 3 18
20% 53 118 129 49 155 378 78 72 160 30 55
30% 120 307 276 106 384 893 201 167 369 97 106
40% 213 592 522 187 675 1714 390 329 694 199 192
50% 354 1063 848 309 1108 2801 663 625 1148 364 312
75% 1160 3067 2563 1008 3163 6609 2116 2294 3243 1312 902
80% 1479 3739 3193 1263 3889 7464 2616 2919 3913 1696 1132
90% 2611 5781 5142 2247 5824 9116 4152 5262 5967 3342 2116
99% 6708 9524 9325 6409 9396 9983 8080 9491 9559 7871 6346
In [37]:
common_neurons_percentage_multiple(gum.ordered_neurons, gsd.ordered_neurons) #англ.и нем. в процентах
Out[37]:
Definite Case Gender Number Degree PronType NumType Person VerbForm Mood Tense
5% 0.75 2.34 4.35 3.54 2.52 2.67 2.15 1.58 3.99 0.70 4.90
10% 3.92 3.07 6.52 5.47 5.36 5.33 2.90 2.59 6.03 0.78 6.92
20% 6.43 6.69 8.79 6.94 9.63 12.48 5.39 6.48 9.69 3.25 8.55
30% 8.63 10.77 11.47 8.81 14.67 19.09 8.45 9.04 13.88 6.23 9.81
40% 10.15 14.88 15.45 10.42 18.05 28.14 11.48 12.13 18.58 8.60 11.87
50% 12.36 20.86 19.05 12.37 22.47 38.03 14.93 16.74 23.44 11.63 13.94
75% 22.07 39.26 35.30 21.49 40.46 70.11 29.36 33.30 42.22 22.00 20.81
80% 25.17 44.75 40.70 23.74 46.55 77.38 33.78 38.27 47.40 25.09 22.96
90% 35.34 62.02 57.03 32.57 62.72 91.90 46.16 57.47 63.85 39.03 32.33
99% 69.69 95.45 93.54 66.89 94.33 99.99 81.08 95.11 95.81 79.25 66.60
In [38]:
common_neurons_percentage_multiple(gum.ordered_neurons, kenet.ordered_neurons) #англ.и турецкий
Out[38]:
Definite Case Number Degree PronType NumType Person VerbForm Mood Tense
5% 0.78 2.48 3.08 1.59 2.10 1.40 1.69 2.48 0.65 3.31
10% 0.91 4.48 3.57 3.94 3.84 3.18 3.58 3.68 2.48 7.19
20% 3.30 8.94 5.45 6.46 11.48 6.69 7.04 6.91 4.93 8.70
30% 5.63 13.82 7.48 9.40 18.99 10.14 9.48 11.36 6.55 11.12
40% 8.37 19.41 9.59 13.33 27.42 14.43 12.97 16.79 9.10 13.17
50% 10.31 26.08 11.85 17.80 38.19 18.83 17.12 22.93 12.02 15.78
75% 19.99 47.57 20.55 36.46 72.89 36.87 31.75 43.77 24.38 27.66
80% 23.14 53.76 23.51 41.98 80.02 42.03 37.36 50.06 28.57 31.42
90% 34.72 69.55 33.66 59.18 93.14 58.33 54.53 68.31 43.62 43.36
99% 70.86 96.28 69.73 91.25 100.00 95.43 93.32 98.05 80.93 79.25
In [39]:
common_neurons_percentage_multiple(gsd.ordered_neurons, kenet.ordered_neurons) #турецкий и немецкий
Out[39]:
Definite Case Number Degree PronType NumType Person VerbForm Mood Tense
5% 0.00 0.88 3.54 1.54 3.16 0.00 1.40 1.74 2.38 7.28
10% 1.60 3.76 2.32 3.59 6.28 1.32 3.47 3.36 5.01 9.11
20% 4.09 8.49 4.31 6.97 11.46 2.92 6.04 6.19 7.57 9.90
30% 5.59 14.74 7.47 9.72 19.23 5.24 8.56 9.52 12.44 10.79
40% 7.29 21.15 8.86 13.50 27.61 8.44 11.54 14.30 17.60 12.23
50% 9.01 28.45 11.19 17.92 36.07 11.51 15.62 19.64 23.59 14.26
75% 18.81 52.93 20.71 35.68 67.02 24.86 33.89 38.07 47.22 23.27
80% 21.81 59.71 23.38 41.46 74.88 28.27 40.03 44.50 55.10 26.24
90% 32.87 77.66 33.00 57.98 91.07 39.79 58.18 61.04 75.05 36.36
99% 69.27 98.95 68.06 90.72 99.99 79.12 94.47 95.72 97.39 75.90